﻿#region Using Region

#region System DLL's
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using CALTypeLib;
using Microsoft.Reporting.WinForms;
using ICE.Vacations.Datos.SQL_Manager;

#endregion

#region Using Externals DLL's

using ICE.Vacations.Entidades;
using ICE.Vacations.Datos.FileManager;

#endregion


#endregion


namespace ICE.Vacations.IIF
{
    public class IIFWorkItem : IIFConnection
    {

        #region Global Resources

        private  CALDocument calDocument;
        private  CALFormFields calFormFields;
        private  CALIndexFields calIndexFields;
        private  CALPage calPage;
        private  CALPages calPages;
        private  CALQueue calQueue;
        private  CALWorkitemInfo calWorkItemInfo;


        private Recurso recurso;

        #region PDF Variables
        private  string OBJECTID = "";
        #endregion

        #region WFL Variables
        private CALWorkflowVariableValue aprob1 = new CALWorkflowVariableValue();
        private CALWorkflowVariableValue aprob2 = new CALWorkflowVariableValue();
        private CALWorkflowVariableValue aprob3 = new CALWorkflowVariableValue();

        private CALWorkflowVariableValue est_aprob1 = new CALWorkflowVariableValue();
        private CALWorkflowVariableValue est_aprob2 = new CALWorkflowVariableValue();
        private CALWorkflowVariableValue est_aprob3 = new CALWorkflowVariableValue();

        private CALWorkflowVariableValue t_aprobadores = new CALWorkflowVariableValue();

        #endregion
        #endregion

        private CALClientListItem getWorkitemQueue(string id)
        {
            try
            {
                CALObjID objectID = new CALObjID();
                objectID.InternalName = id;
                CALWorkitemWorkstepList calWorkitemWorkstepList = (CALWorkitemWorkstepList)calClient.FindInWorkflow(objectID);
                var gCalEnumItemFound = calWorkitemWorkstepList.Item[1];
                var gCalClientListItemFound = (CALClientListItem)gCalEnumItemFound.Retrieve(RetrieveConstants.calRetrieveRetain);
                calDocument = (CALDocument)gCalClientListItemFound.Open(OpenConstants.calOpenReadWrite);

                return gCalClientListItemFound;
            }
            catch (Exception exc)
            {
                Logger.fileWrite("ERROR en FindInWFL : " + exc.Message, Logger.MessageType.Error);
                throw (exc);
            }

        }

        private CALClientListItem getWorkitem(string id)
        {
            try
            {

                Logger.fileWrite("Estableciendo el ObjectID a buscar [" + id + "]...", Logger.MessageType.Information);
                CALObjID objectID = new CALObjID();
                objectID.InternalName = id;
                Logger.fileWrite("ObjectID [" + id + "] establecido para su búsqueda.", Logger.MessageType.Information);

                Logger.fileWrite("Buscando ObjectID [" + objectID.InternalName.ToString() + "] en el escritorio del usuario.", Logger.MessageType.Information);
                try
                {

                    calClientList = calClient.ClientList;
                    //calClientList = (CALClientList)calClient.ClientList;

                    var doc = calClientList.Find(objectID);
                    return (CALClientListItem)doc;
                }
                catch (Exception calException)
                {
                    Logger.fileWrite("Error: No se pudo extraer el workitem con ObjectID [" + id + "] del escritorio del usuario. ERROR [" + calException.Message + "].", Logger.MessageType.Error);
                    throw (calException);
                }
            }
            catch (Exception calException)
            {
                throw (calException);

            }
        }
        private string getObjectID()
        {
            try
            {
                Logger.fileWrite("Obteniendo el OBJECT_ID del workitem", Logger.MessageType.Information);
                OBJECTID = calDocument.Info.ObjID.ToString();
                Logger.fileWrite("OBJECT_ID obtenido correctamente.", Logger.MessageType.Information);
                return OBJECTID;
            }
            catch (Exception exc)
            {
                Logger.fileWrite("ERROR: No se pudo obtener el OBJECT_ID del Workitem", Logger.MessageType.Error);
                throw (exc);
                
            }
        }

        private  bool SendToWorkFlow(string objectID)
        {
            try
            {
                //base.CreateIIFClient(Config.IIFUser, Config.IIFPassword, Config.IIFDomain);
               
                #region Obtener el Workitem
               
                 calClientListItem = getWorkitem(objectID);

                #endregion
               try
               {
                   Logger.fileWrite("Enviando el workitem al siguiente paso en el flujo de trabajo.", Logger.MessageType.Information);
                   calClientListItem.SendToDefault(SendConstants.calSendDiscard);
                   Logger.fileWrite("Workitem enviado al siguiente paso del flujo.", Logger.MessageType.Information);
               }
               catch (Exception calException)
               {
                   Logger.fileWrite("", Logger.MessageType.Error);
                   throw (calException);
               }
               #region Comments
               //Logger.fileWrite("Estableciendo el workstep [" + queueName + "] a donde será enviado el workitem [" + objectID + "]...", Logger.MessageType.Information);
                //calQueue.Name = queueName;
                //calQueue.Type = IIFQueueTypeConstants.QueueTypeWorkstep;
                //Logger.fileWrite("Workstep [" + queueName + "] asignado correctamente", Logger.MessageType.Information);

                //if (queueName.Equals(""))
                //{
                //    Logger.fileWrite("No se encontro un nombre de workstep de salida para el documento [" + "] por lo que será enviado a la cola [Default].", Logger.MessageType.Information);

                //    calClientListItem.SendToDefault(IIFSendConstants.SendDiscard);
                //    Logger.fileWrite("El workitem [" + objectID + "] fue enviado a la cola [Default].", Logger.MessageType.Information);
                    
                //}
                //else
                //{
                //    Logger.fileWrite("Enviando workitem [" + "] a la cola [" + queueName + "]...", Logger.MessageType.Information);

                //    calClientListItem.Send(calQueue, IIFSendConstants.SendDiscard);
                //    Logger.fileWrite("El workitem [" + objectID + "] fue enviado a la cola [" + queueName + "].", Logger.MessageType.Information);

                //}
               //base.DestroyIIFClient();
               #endregion

               return true;
            }
            catch (Exception exc)
            {
                Logger.fileWrite("No se logró enviar el workitem al flujo de trabajo.", Logger.MessageType.Error);
                base.DestroyIIFClient();
                return false;
            }

        }

        public string CreateWorkitem(Solicitud solicitud, Recurso recurso)
        {
            this.recurso = recurso;
            try
            {
               
                base.CreateIIFClient(Config.IIFUser, Config.IIFPassword, Config.IIFDomain);
               
                #region Create IIF Document
                
                calWorkItemInfo = (CALWorkitemInfo)calClient.CreateDocument(Config.uDocument, Config.docClass);
                calClientListItem = (CALClientListItem)calClientList.Add(calWorkItemInfo.ObjID, ClientListAddConstants.calAddRetain);
                calDocument = (CALDocument)calClientListItem.Open(OpenConstants.calOpenReadWrite);
                calFormFields = (CALFormFields)calDocument.FormFields(FieldConstants.calFieldsNoViews);
                
                #endregion
                
                #region Set Form Values

              
                   calFormFields.Find("CEDULA").set_Value( 1,solicitud.employeeID);
                   calFormFields.Find("DEPEND").set_Value(1, recurso.nombre);


                   calFormFields.Find("folio").set_Value(1, recurso.cod_direccion);

                   calFormFields.Find("CF").set_Value(1, recurso.cod_cf);
                   calFormFields.Find("UDOCUMEN").set_Value(1, Config.uDocument);
                   calFormFields.Find("FECHA").set_Value(1, solicitud.fechaRegistro.ToString("dd/MM/yyyy"));
                   calFormFields.Find("AÑO").set_Value(1, solicitud.fechaRegistro.ToString("yyyy"));

                   calFormFields.Find("JEFE").set_Value(1, recurso.aprobador1);

             
                #endregion

                #region Save Workitem
                Logger.fileWrite("Guardando workitem en el escritorio del usuario...", Logger.MessageType.Information);
                calDocument.Save();

                Logger.fileWrite("Obteniendo OBJECT_ID del workitem creado....", Logger.MessageType.Information);
                OBJECTID = calDocument.Info.ObjID.InternalName.ToString();


                Logger.fileWrite("OBJECT_ID [" +OBJECTID+"] obtenido satisfactoriamente.", Logger.MessageType.Information);
                calDocument.Close(CloseConstants.calCloseSaveChanges);
                
                Logger.fileWrite("Workitem guardado correctamente.", Logger.MessageType.Information);


//                Logger.fileWrite("Estado luego de ser guardado: [" + calWorkItemInfo.Status.ToString() + "]", Logger.MessageType.Information);

                
                #endregion

                #region Set WFL Variables
                SetWFLVariables(recurso);
                #endregion
                //Logger.fileWrite("ENTRANDO A base.DestroyIIFClientExplicit() [" + OBJECTID.ToString() + "]...", Logger.MessageType.Information);

                base.DestroyIIFClientExplicit();
                //Logger.fileWrite("SALIENDO DE base.DestroyIIFClientExplicit() [" + OBJECTID.ToString() + "]...", Logger.MessageType.Information);
   
                Logger.fileWrite("Retornando valor de OBJECT_ID: [" + OBJECTID.ToString() + "]...", Logger.MessageType.Information);
                //return getObjectID();
                return OBJECTID;
                  
                    
            }
            catch (Exception IIFCalException)
            {
                //Logger.fileWrite("ME CAI", Logger.MessageType.Error);

                base.DestroyIIFClientExplicit();
                Logger.fileWrite("ERROR: " + IIFCalException.Message, Logger.MessageType.Error);
                throw (IIFCalException);
                //if (OBJECTID.Equals(""))
                //    throw (IIFCalException);
                //else
                //    return OBJECTID;

            }
        }

 
        private  bool SaveWorkitem(string objectID)
        {
            try
            {
                try
                {
                    
                    calDocument = (CALDocument)getWorkitem(objectID).Open(OpenConstants.calOpenReadWrite);
                }
                catch (Exception calException)
                {
                    throw (calException);
                }

                Logger.fileWrite("Guardando workitem en el escritorio del usuario...", Logger.MessageType.Information);
                calDocument.Save();

                Logger.fileWrite("Obteniendo OBJECT_ID del workitem creado....", Logger.MessageType.Information);
                OBJECTID = calDocument.Info.ObjID.ToString();

                Logger.fileWrite("OBJECT_ID obtenido satisfactoriamente.", Logger.MessageType.Information);
                calDocument.Close(CloseConstants.calCloseSaveChanges);

                Logger.fileWrite("Workitem guardado correctamente.", Logger.MessageType.Information);
                return true;

                
            }
            catch (Exception calException)
            {
                Logger.fileWrite("Error intentando guardar el workitem en el escritorio del usuario. Error: [" + calException.Message + "]", Logger.MessageType.Information);
                throw (calException);
            }
        }

        private  void LoadPDF(string imagePath)
        {
            try
            {
                Logger.fileWrite("Asignando PDF al documento. Imagen asociada [" + imagePath + "]", Logger.MessageType.Information);
                calDocument.ImportPages(imagePath, null, null);
                Logger.fileWrite("PDF asigando correctamente.", Logger.MessageType.Information);
                try
                {
                    Logger.fileWrite("Borrando archivo PDF...", Logger.MessageType.Information);
                    System.IO.File.Delete(imagePath);
                    Logger.fileWrite("PDF borrado correctamente.", Logger.MessageType.Information);
                }
                catch (IOException exc)
                {
                    Logger.fileWrite("Error al momento de borrar el archivo PDF asociado. Error: [" + exc.Message + "].", Logger.MessageType.Error);
                }

            }
            catch (Exception calException)
            {
                Logger.fileWrite("No se pudo cargar el PDF correspondiente. Error: [" + calException.Message + "].", Logger.MessageType.Error);
                throw (calException);
            }

        }

        /// <summary>
        /// Establece las variables para permitir el correcto enrutamiento a nivel de WFL
        /// </summary>
        public  void Resolution(Solicitud solicitud, string estado)
        {
            base.CreateIIFClient(Config.IIFUser, Config.IIFPassword, Config.IIFDomain);
            #region Obtener el Workitem
            try
            {
                calClientListItem = getWorkitemQueue(solicitud.objectID);
                    //getWorkitem(solicitud.objectID);
                    
                    
            }
            catch (Exception calException)
            {
                Logger.fileWrite("ERROR obteniendo el WORKITEM [" + solicitud.objectID + "] " + calException.Message, Logger.MessageType.Error);
                throw (calException);
            }
            #endregion

           string workStep = calClientListItem.Info.SourceWorkstep.ToString();
           Logger.fileWrite("QUEUE actual [" + workStep + "]", Logger.MessageType.Information);
           Logger.fileWrite("ESTADO [" + estado + "]", Logger.MessageType.Information);
           //Se encuentra en el PASO 1
           if(workStep.Equals(Config.queue1))
             {
                    #region Estado Aprobador 1
                    try
                    {
                        //string estado1 = "";
                        //estado1 = calClient.get_WorkflowVariables("est_aprob1", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, calClient.UserName).get_Item(1).Value.ToString();
                        //est_aprob2.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;

                        switch (estado)
                        {
                            //Aprobado
                            case "A":
                                #region Set Variable est_aprob1 = A
                                Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [est_aprob1].", Logger.MessageType.Information);
                                try
                                {
                                    est_aprob1.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                                    est_aprob1.Value = "A";
                                }
                                catch (Exception exc)
                                {
                                    Logger.fileWrite("ERROR al establecer en la variable de flujo [est_aprob1] = " + exc.Message, Logger.MessageType.Information);

                                }
                                
                                Logger.fileWrite("Valor obtenido para la variable [aprob1] = [" + est_aprob1.Value.ToString() + "].", Logger.MessageType.Information);

                                //Establecer el valor de la variable respecto a las validaciones.
                                Logger.fileWrite("Estableciendo el valor [" + est_aprob1.Value.ToString() + "] a la varible [est_aprob1].", Logger.MessageType.Information);

                                calClient.SetWorkflowVariable("est_aprob1", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, est_aprob1, calClient.UserName);
                                Logger.fileWrite("Valor [" + est_aprob1.Value.ToString() + "] establecido correctamente a la varible [est_aprob1].", Logger.MessageType.Information);
                                #endregion

                                #region SendToDefault in WFL
                                //calDocument.Close(CloseConstants.calCloseSaveChanges);
                                SendToWorkFlow(solicitud.objectID);
                                #endregion

                                break;

                            //Cancelado
                            case "C":

                                #region Set Variable est_aprob1 = C
                                Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [est_aprob1].", Logger.MessageType.Information);
                                est_aprob1.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                                est_aprob1.Value = "C";
                                Logger.fileWrite("Valor obtenido para la variable [aprob1] = [" + est_aprob1.Value.ToString() + "].", Logger.MessageType.Information);

                                //Establecer el valor de la variable respecto a las validaciones.
                                Logger.fileWrite("Estableciendo el valor [" + est_aprob1.Value.ToString() + "] a la varible [est_aprob1].", Logger.MessageType.Information);

                                calClient.SetWorkflowVariable("est_aprob1", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, est_aprob1, calClient.UserName);
                                Logger.fileWrite("Valor [" + est_aprob1.Value.ToString() + "] establecido correctamente a la varible [est_aprob1].", Logger.MessageType.Information);
                                #endregion

                                #region SendToDefault in WFL
                                
                                SendToWorkFlow(solicitud.objectID);
                                #endregion
                                break;

                            //Denegado
                            case "D":
                                #region Set Variable est_aprob1 = D
                                Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [est_aprob1].", Logger.MessageType.Information);
                                est_aprob1.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                                est_aprob1.Value = "D";
                                Logger.fileWrite("Valor obtenido para la variable [aprob1] = [" + est_aprob1.Value.ToString() + "].", Logger.MessageType.Information);

                                //Establecer el valor de la variable respecto a las validaciones.
                                Logger.fileWrite("Estableciendo el valor [" + est_aprob1.Value.ToString() + "] a la varible [est_aprob1].", Logger.MessageType.Information);

                                calClient.SetWorkflowVariable("est_aprob1", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, est_aprob1, calClient.UserName);
                                Logger.fileWrite("Valor [" + est_aprob1.Value.ToString() + "] establecido correctamente a la varible [est_aprob1].", Logger.MessageType.Information);
                                #endregion

                                #region SendToDefault in WFL
                              
                                SendToWorkFlow(solicitud.objectID);
                                #endregion
                                break;

                            //Salvada
                            case "S":

                                #region Set Variable est_aprob1 = S
                                Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [est_aprob1].", Logger.MessageType.Information);
                                est_aprob1.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                                est_aprob1.Value = "S";
                                Logger.fileWrite("Valor obtenido para la variable [aprob1] = [" + est_aprob1.Value.ToString() + "].", Logger.MessageType.Information);

                                //Establecer el valor de la variable respecto a las validaciones.
                                Logger.fileWrite("Estableciendo el valor [" + est_aprob1.Value.ToString() + "] a la varible [est_aprob1].", Logger.MessageType.Information);

                                calClient.SetWorkflowVariable("est_aprob1", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, est_aprob1, calClient.UserName);
                                Logger.fileWrite("Valor [" + est_aprob1.Value.ToString() + "] establecido correctamente a la varible [est_aprob1].", Logger.MessageType.Information);

                                #endregion

                                break;

                            //Borrar
                            case "B":
                                #region Deleting Workitem
                                try
                                {
                                    Logger.fileWrite("Intentando eliminar el Workitem con ObjectID [" + solicitud.objectID + "]..", Logger.MessageType.Information);
                                    calClientList.DeleteWorkitem(calClientListItem, DeleteWorkitemConstants.calDeleteWorkitemEntDelete);
                                    Logger.fileWrite("Workitem con ObjectID [" + solicitud.objectID + "] borrado satisfactoriamente.", Logger.MessageType.Information);
                                }
                                catch (Exception calException)
                                {
                                    Logger.fileWrite("Error al momento de eliminar el workitem [" + "]. ERROR: [" + calException.Message + "].", Logger.MessageType.Error);
                                    throw (calException);
                                }

                                #endregion

                                break;

                        }

                    }
                    catch (Exception calException)
                    {
                        throw (calException);
                    }
                    #endregion
             } else   
               //Se encuentra en el PASO 2
               if(workStep.Equals(Config.queue2))
               {
                    #region Estado Aprobador 2
                    try
                    {
                        //string estado2 = "";
                        //estado2 = calClient.get_WorkflowVariables("est_aprob2", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, calClient.UserName).get_Item(1).Value.ToString();
                        //est_aprob2.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;

                        switch (estado)
                        {
                            //Aprobado
                            case "A":
                                #region Set Variable est_aprob1 = A
                                Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [est_aprob2].", Logger.MessageType.Information);
                                est_aprob2.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                                est_aprob2.Value = "A";
                                Logger.fileWrite("Valor obtenido para la variable [aprob2] = [" + est_aprob2.Value.ToString() + "].", Logger.MessageType.Information);

                                //Establecer el valor de la variable respecto a las validaciones.
                                Logger.fileWrite("Estableciendo el valor [" + est_aprob2.Value.ToString() + "] a la varible [est_aprob2].", Logger.MessageType.Information);

                                calClient.SetWorkflowVariable("est_aprob2", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, est_aprob2, calClient.UserName);
                                Logger.fileWrite("Valor [" + est_aprob2.Value.ToString() + "] establecido correctamente a la varible [est_aprob2].", Logger.MessageType.Information);
                                #endregion

                                #region SendToDefault in WFL
                               
                                SendToDefault();
                                #endregion

                                break;

                            //Cancelado
                            case "C":

                                #region Set Variable est_aprob2 = C
                                Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [est_aprob2].", Logger.MessageType.Information);
                                est_aprob2.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                                est_aprob2.Value = "C";
                                Logger.fileWrite("Valor obtenido para la variable [aprob2] = [" + est_aprob2.Value.ToString() + "].", Logger.MessageType.Information);

                                //Establecer el valor de la variable respecto a las validaciones.
                                Logger.fileWrite("Estableciendo el valor [" + est_aprob2.Value.ToString() + "] a la varible [est_aprob2].", Logger.MessageType.Information);

                                calClient.SetWorkflowVariable("est_aprob2", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, est_aprob2, calClient.UserName);
                                Logger.fileWrite("Valor [" + est_aprob2.Value.ToString() + "] establecido correctamente a la varible [est_aprob2].", Logger.MessageType.Information);
                                #endregion

                                #region SendToDefault in WFL
                               
                                SendToDefault();
                                #endregion

                                break;

                            //Denegado
                            case "D":
                                #region Set Variable est_aprob2 = D
                                Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [est_aprob1].", Logger.MessageType.Information);
                                est_aprob2.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                                est_aprob2.Value = "D";
                                Logger.fileWrite("Valor obtenido para la variable [aprob1] = [" + est_aprob1.Value.ToString() + "].", Logger.MessageType.Information);

                                //Establecer el valor de la variable respecto a las validaciones.
                                Logger.fileWrite("Estableciendo el valor [" + est_aprob2.Value.ToString() + "] a la varible [est_aprob2].", Logger.MessageType.Information);

                                calClient.SetWorkflowVariable("est_aprob2", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, est_aprob2, calClient.UserName);
                                Logger.fileWrite("Valor [" + est_aprob2.Value.ToString() + "] establecido correctamente a la varible [est_aprob1].", Logger.MessageType.Information);
                                #endregion

                                #region SendToDefault in WFL
                                
                                SendToDefault();
                                #endregion

                                break;

                            //Salvada
                            case "S":

                                #region Set Variable est_aprob2 = S
                                Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [est_aprob2].", Logger.MessageType.Information);
                                est_aprob1.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                                est_aprob2.Value = "S";
                                Logger.fileWrite("Valor obtenido para la variable [aprob2] = [" + est_aprob2.Value.ToString() + "].", Logger.MessageType.Information);

                                //Establecer el valor de la variable respecto a las validaciones.
                                Logger.fileWrite("Estableciendo el valor [" + est_aprob2.Value.ToString() + "] a la varible [est_aprob1].", Logger.MessageType.Information);

                                calClient.SetWorkflowVariable("est_aprob1", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, est_aprob2, calClient.UserName);
                                Logger.fileWrite("Valor [" + est_aprob2.Value.ToString() + "] establecido correctamente a la varible [est_aprob1].", Logger.MessageType.Information);

                                #endregion
                                calDocument.Close(CloseConstants.calCloseSaveChanges);
                                break;

                            //Borrar
                            case "B":
                                #region Deleting Workitem
                                try
                                {
                                    Logger.fileWrite("Intentando eliminar el Workitem con ObjectID [" + solicitud.objectID + "]..", Logger.MessageType.Information);
                                    calClientList.DeleteWorkitem(calClientListItem, DeleteWorkitemConstants.calDeleteWorkitemEntDelete);
                                    Logger.fileWrite("Workitem con ObjectID [" + solicitud.objectID + "] borrado satisfactoriamente.", Logger.MessageType.Information);
                                }
                                catch (Exception calException)
                                {
                                    Logger.fileWrite("Error al momento de eliminar el workitem [" + "]. ERROR: [" + calException.Message + "].", Logger.MessageType.Error);
                                    throw (calException);
                                }

                                #endregion

                                break;

                        }

                    }
                    catch (Exception calException)
                    {
                        throw (calException);
                    }
                    #endregion
           
               }else 

                   //Se encuentra en el PASO 3
                   if(workStep.Equals(Config.queue2))
                   {
                    #region Estado Aprobador 3
                    try
                    {
                        //string estado3 = "";
                        //estado3 = calClient.get_WorkflowVariables("est_aprob3", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, calClient.UserName).get_Item(1).Value.ToString();
                        //est_aprob3.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;

                        switch (estado)
                        {
                            //Aprobado
                            case "A":
                                #region Set Variable est_aprob3 = A
                                Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [est_aprob3].", Logger.MessageType.Information);
                                est_aprob3.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                                est_aprob3.Value = "A";
                                Logger.fileWrite("Valor obtenido para la variable [aprob3] = [" + est_aprob3.Value.ToString() + "].", Logger.MessageType.Information);

                                //Establecer el valor de la variable respecto a las validaciones.
                                Logger.fileWrite("Estableciendo el valor [" + est_aprob3.Value.ToString() + "] a la varible [est_aprob2].", Logger.MessageType.Information);

                                calClient.SetWorkflowVariable("est_aprob3", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, est_aprob3, calClient.UserName);
                                Logger.fileWrite("Valor [" + est_aprob3.Value.ToString() + "] establecido correctamente a la varible [est_aprob2].", Logger.MessageType.Information);
                                #endregion

                                #region SendToDefault in WFL

                                SendToDefault();
                                #endregion

                                break;

                            //Cancelado
                            case "C":

                                #region Set Variable est_aprob3 = C
                                Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [est_aprob3].", Logger.MessageType.Information);
                                est_aprob3.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                                est_aprob3.Value = "C";
                                Logger.fileWrite("Valor obtenido para la variable [aprob3] = [" + est_aprob3.Value.ToString() + "].", Logger.MessageType.Information);

                                //Establecer el valor de la variable respecto a las validaciones.
                                Logger.fileWrite("Estableciendo el valor [" + est_aprob3.Value.ToString() + "] a la varible [est_aprob3].", Logger.MessageType.Information);

                                calClient.SetWorkflowVariable("est_aprob3", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, est_aprob3, calClient.UserName);
                                Logger.fileWrite("Valor [" + est_aprob3.Value.ToString() + "] establecido correctamente a la varible [est_aprob3].", Logger.MessageType.Information);
                                #endregion

                                #region SendToDefault in WFL

                                SendToDefault();
                                #endregion
                                break;

                            //Denegado
                            case "D":
                                #region Set Variable est_aprob3 = D
                                Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [est_aprob1].", Logger.MessageType.Information);
                                est_aprob3.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                                est_aprob3.Value = "D";
                                Logger.fileWrite("Valor obtenido para la variable [aprob3] = [" + est_aprob3.Value.ToString() + "].", Logger.MessageType.Information);

                                //Establecer el valor de la variable respecto a las validaciones.
                                Logger.fileWrite("Estableciendo el valor [" + est_aprob3.Value.ToString() + "] a la varible [est_aprob3].", Logger.MessageType.Information);

                                calClient.SetWorkflowVariable("est_aprob3", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, est_aprob3, calClient.UserName);
                                Logger.fileWrite("Valor [" + est_aprob3.Value.ToString() + "] establecido correctamente a la varible [est_aprob3].", Logger.MessageType.Information);
                                #endregion

                                #region SendToDefault in WFL

                                SendToDefault();
                                #endregion
                                break;

                            //Salvada
                            case "S":

                                #region Set Variable est_aprob3 = S
                                Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [est_aprob3].", Logger.MessageType.Information);
                                est_aprob3.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                                est_aprob3.Value = "S";
                                Logger.fileWrite("Valor obtenido para la variable [aprob3] = [" + est_aprob3.Value.ToString() + "].", Logger.MessageType.Information);

                                //Establecer el valor de la variable respecto a las validaciones.
                                Logger.fileWrite("Estableciendo el valor [" + est_aprob3.Value.ToString() + "] a la varible [est_aprob3].", Logger.MessageType.Information);


                                calClient.SetWorkflowVariable("est_aprob3", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, est_aprob3, calClient.UserName);
                                Logger.fileWrite("Valor [" + est_aprob3.Value.ToString() + "] establecido correctamente a la varible [est_aprob3].", Logger.MessageType.Information);

                                #endregion

                                break;

                            //Borrar
                            case "B":
                                #region Deleting Workitem
                                try
                                {
                                    Logger.fileWrite("Intentando eliminar el Workitem con ObjectID [" + solicitud.objectID + "]..", Logger.MessageType.Information);
                                    calClientList.DeleteWorkitem(calClientListItem, DeleteWorkitemConstants.calDeleteWorkitemEntDelete);
                                    Logger.fileWrite("Workitem con ObjectID [" + solicitud.objectID + "] borrado satisfactoriamente.", Logger.MessageType.Information);
                                }
                                catch (Exception calException)
                                {
                                    Logger.fileWrite("Error al momento de eliminar el workitem [" + "]. ERROR: [" + calException.Message + "].", Logger.MessageType.Error);
                                    throw (calException);
                                }

                                #endregion

                                break;

                        }
                    }
                    catch (Exception calException)
                    {
                        throw (calException);
                    }
                    #endregion
                   }

                base.DestroyIIFClient();
            }//end Resolution


        private void SendToDefault()
        {
            try
            {
                Logger.fileWrite("Enviando el workitem al siguiente paso en el flujo de trabajo.", Logger.MessageType.Information);
                calClientListItem.SendToDefault(SendConstants.calSendDiscard);
                Logger.fileWrite("Workitem enviado al siguiente paso del flujo.", Logger.MessageType.Information);
            }
            catch (Exception calException)
            {
                Logger.fileWrite("Error al momento de enviar al Flujo. ERROR:" +calException.Message, Logger.MessageType.Error);
                throw (calException);
            }
        }//SendToDefault()

        public void AttachPDF_Send(Solicitud solicitud, string path )
        {
            #region Obtener el Workitem
            try
            {
                base.CreateIIFClient(Config.IIFUser, Config.IIFPassword, Config.IIFDomain);
               // path.Replace("\\",'\');
                calClientListItem = getWorkitem(solicitud.objectID);

            }
            catch(Exception calException)
            {
                Logger.fileWrite("Error al momento de cargar el Workitem asociado. ERROR: ["+calException.Message+"].",Logger.MessageType.Error);
                throw(calException);
                
            }
            try
            {
                
                calDocument = (CALDocument)calClientListItem.Open(OpenConstants.calOpenReadWrite);
                Logger.fileWrite("Agregando PDF [" + path +"] a la solicitud [" + solicitud.requestID + "]..", Logger.MessageType.Information);
                try
                {

                    calDocument.Imports.Add(1, "PDF", "PDF", path+".pdf");
                    Logger.fileWrite("PDF [" + path +".pdf] agregado correctamente a la solicitud [" + solicitud.requestID + "].", Logger.MessageType.Information);
                }
                catch (Exception calException)
                {
                    Logger.fileWrite("Error al momento de intentar asignar el PDF al workitem. ERROR: [" + calException.Message + "].", Logger.MessageType.Error);
                    throw (calException);
                }
               // calDocument.Save();
                calDocument.Close(CloseConstants.calCloseSaveChanges);
            }
            catch (Exception calException)
            {
                Logger.fileWrite("Error al momento de cargar el PDF al workitem asociado. ERROR: [" + calException.Message + "].", Logger.MessageType.Error);
                throw (calException);
            }
            #endregion

            SendToDefault();
            base.DestroyIIFClient();

        }//end AttachPDF_Send()

        private void SetWFLVariables(Recurso recurso)
        {
            #region Aprobador 1
            try
            {

                aprob1.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [aprob1].", Logger.MessageType.Information);
                aprob1.Value = recurso.aprobador1;
                Logger.fileWrite("Valor obtenido para la variable [aprob1] = [" + aprob1.Value.ToString() + "].", Logger.MessageType.Information);

                //Establecer el valor de la variable respecto a las validaciones.
                Logger.fileWrite("Estableciendo el valor [" + aprob1.Value.ToString() + "] a la varible [aprob1].", Logger.MessageType.Information);

                calClient.SetWorkflowVariable("aprob1", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, aprob1, calClient.UserName);
                Logger.fileWrite("Valor [" + aprob1.Value.ToString() + "] establecido correctamente a la varible [aprob1].", Logger.MessageType.Information);

            }
            catch (Exception calException)
            {
                throw (calException);
            }
            #endregion

            #region Aprobador 2
            try
            {
                if (!(recurso.aprobador2.Equals("")))
                {
                    aprob2.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                    Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [aprob2].", Logger.MessageType.Information);
                    aprob2.Value = recurso.aprobador1;
                    Logger.fileWrite("Valor obtenido para la variable [aprob2] = [" + aprob2.Value.ToString() + "].", Logger.MessageType.Information);

                    //Establecer el valor de la variable respecto a las validaciones.
                    Logger.fileWrite("Estableciendo el valor [" + aprob2.Value.ToString() + "] a la varible [aprob2].", Logger.MessageType.Information);

                    calClient.SetWorkflowVariable("aprob2", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, aprob2, calClient.UserName);
                    Logger.fileWrite("Valor [" + aprob2.Value.ToString() + "] establecido correctamente a la varible [aprob2].", Logger.MessageType.Information);
                }

            }
            catch (Exception calException)
            {
                throw (calException);
            }
            #endregion

            #region Aprobador 3
            try
            {
                if (!(recurso.aprobador3.Equals("")))
                {
                    aprob3.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeString;
                    Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [aprob3].", Logger.MessageType.Information);
                    aprob3.Value = recurso.aprobador3;
                    Logger.fileWrite("Valor obtenido para la variable [aprob3] = [" + aprob3.Value.ToString() + "].", Logger.MessageType.Information);

                    //Establecer el valor de la variable respecto a las validaciones.
                    Logger.fileWrite("Estableciendo el valor [" + aprob3.Value.ToString() + "] a la varible [aprob3].", Logger.MessageType.Information);

                    calClient.SetWorkflowVariable("aprob3", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, aprob3, calClient.UserName);
                    Logger.fileWrite("Valor [" + aprob3.Value.ToString() + "] establecido correctamente a la varible [aprob3].", Logger.MessageType.Information);

                }
            }
            catch (Exception calException)
            {
                throw (calException);
            }
            #endregion

            #region Total de Aprobadores
            try
            {

                t_aprobadores.Type = WorkflowVariableTypeConstants.calWorkflowVariableTypeInteger;
                Logger.fileWrite("Obteniendo valor a establecer en la variable de flujo [t_aprobadores].", Logger.MessageType.Information);
                t_aprobadores.Value = SQLDataClass.TotalAprovees(recurso.cedula);
                Logger.fileWrite("Valor obtenido para la variable [t_aprobadores] = [" + t_aprobadores.Value.ToString() + "].", Logger.MessageType.Information);

                Logger.fileWrite("Estableciendo el valor [" + t_aprobadores.Value.ToString() + "] a la varible [t_aprobadores].", Logger.MessageType.Information);
                calClient.SetWorkflowVariable("t_aprobadores", WorkflowVariableCategoryConstants.calWorkflowVariableCategoryRoute, t_aprobadores, calClient.UserName);
                Logger.fileWrite("Valor [" + t_aprobadores.Value.ToString() + "] establecido correctamente a la varible [t_aprobadores].", Logger.MessageType.Information);

            }
            catch (Exception calException)
            {
                throw (calException);
            }
            #endregion
        }//end SetWFLVariables()


    }

}

